home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / MacPS source / ucbwhich.c < prev    next >
Text File  |  1989-01-17  |  3KB  |  120 lines

  1. /*
  2.  * Copyright (c) 1988, The Trustees of the University of California.
  3.  * Edward Moy, Workstation Software Support Group, Workstation Support Serices,
  4.  * Information Systems and Technology.
  5.  *
  6.  * Permission is granted to any individual or institution to use, copy,
  7.  * or redistribute this software so long as it is not sold for profit,
  8.  * provided that this notice and the original copyright notices are
  9.  * retained.  The University of California makes no representations about the
  10.  * suitability of this software for any purpose.  It is provided "as is"
  11.  * without express or implied warranty.
  12.  */
  13.  
  14. #ifndef lint
  15. static char *SCCSid = "@(#)ucbwhich.c    1.1 9/19/88";
  16. #endif lint
  17.  
  18. #include <stdio.h>
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include "ucbwhich.h"
  22.  
  23. #define    F_OK        0    /* does file exist */
  24. #define    X_OK        1    /* is it executable by caller */
  25. #define    W_OK        2    /* writable by caller */
  26. #define    R_OK        4    /* readable by caller */
  27.  
  28. #define    LIBLEN        4
  29.  
  30. static char lib[] = "/lib";
  31.  
  32. char ucblib[UCBMAXPATHLEN];
  33. int ucbalternate = 0;
  34. char ucbpath[UCBMAXPATHLEN];
  35.  
  36. ucbwhich(str)
  37. char *str;
  38. {
  39.     register char *dir, *name, *cp, *tp;
  40.     register int len;
  41.     char dirbuf[UCBMAXPATHLEN], namebuf[UCBMAXPATHLEN];
  42.     struct stat sbuf;
  43.     char *index(), *rindex(), *getwd(), *getenv();
  44.  
  45.     strcpy(name = namebuf, str);
  46.     if(*name == '/')    /* absolute pathname */
  47.         *(rindex(dir = name, '/')) = 0 ; /* remove tail */
  48.     else {
  49.         if(cp = index(name, '/')) { /* relative pathname */
  50.             if((dir = getwd(dirbuf)) == NULL)
  51.                 return(0);
  52.              /* if any errors occurs assume standard version */
  53.             *cp++ = 0;
  54.             for( ; ; ) {
  55.                 if(*name != 0) { /* multiple slashes */
  56.                     if(strcmp(name, "..") == 0) {
  57.                         /* parent directory */
  58.                         if((tp = rindex(dir, '/')) ==
  59.                          NULL)
  60.                              return(0);
  61.                         if(tp == dir)
  62.                             tp++;
  63.                          /* root directory */
  64.                         *tp = 0;
  65.                          /* remove last component */
  66.                     } else if(strcmp(name, ".") != 0) {
  67.                         /* subdirectory */
  68.                         strcat(dir, "/");
  69.                         strcat(dir, name);
  70.                     }
  71.                 }
  72.                 name = cp;
  73.                 if((cp = index(name, '/')) == NULL) break;
  74.                 /* ignore last component */
  75.                 *cp++ = 0;
  76.             }
  77.         } else { /* look through $PATH variable */
  78.             if((tp = getenv("PATH")) == NULL)
  79.                 return(0);
  80.             for(name = namebuf ; ; ) {
  81.                 if(*tp == 0)
  82.                     return(0);
  83.                 else if(*tp == ':')
  84.                     tp++;
  85.                 if((cp = index(tp, ':')) == NULL)
  86.                     cp = tp + strlen(tp);
  87.                  /* positioned on null */
  88.                 for(dir = dirbuf ; tp < cp ; )
  89.                     *dir++ = *tp++;
  90.                 *dir = 0;
  91.                 strcpy(name, dir = dirbuf);
  92.                 strcat(name, "/");
  93.                 strcat(name, str);
  94.                 if(stat(name, &sbuf) < 0 || (sbuf.st_mode &
  95.                  S_IFMT) != S_IFREG)
  96.                     continue;
  97.                 if(access(name, X_OK) == 0) {
  98.                     if(strcmp(dir, ".") == 0 &&
  99.                      (dir = getwd(dirbuf)) == NULL)
  100.                         return(0);
  101.                     break;
  102.                 }
  103.             }
  104.         }
  105.     }
  106.     strcpy(ucbpath, dir);
  107.     strcpy(ucblib, dir);
  108.     if((len = strlen(dir)) < LIBLEN || strcmp(&dir[len - LIBLEN], lib)
  109.      != 0)
  110.         strcat(ucblib, lib);
  111.     else
  112.         ucbpath[len - LIBLEN] = 0;
  113.     ucbalternate = (strcmp(ucbpath, UCBSTANDARD) != 0);
  114. #ifdef EBUG
  115.     fprintf(stderr, "ucbwhich: alt=%d path=%s lib=%s\n", ucbalternate,
  116.      ucbpath, ucblib);
  117. #endif EBUG
  118.     return(ucbalternate);
  119. }
  120.